package com.xxx.exception;

import com.xxx.constant.GlobleExceptioniContants;
import com.xxx.result.JSONResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * 拦截全局异常,并进行全局异常处理
 *
 */
@RestControllerAdvice  //restcontrolleradvice
public class GlobleExceptionHandler {


    /**
     * 系统异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public JSONResult handleException(Exception e) {
        e.printStackTrace(); // 自己打出来看
        return JSONResult.error(GlobleExceptioniContants.SYSTEM_ERROR);
    }
    
    /**
     * 参数验证异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JSONResult handleValidationException(MethodArgumentNotValidException e) {
        // 获取验证失败的字段错误信息
        String errorMessage = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
        return JSONResult.error(errorMessage);
    }
    /**
     * 自定义的异常  全局业务异常
     * @param e
     * @return
     */
    @ExceptionHandler(GlobleBussnessException.class)
    public JSONResult GlobleHandleException(GlobleBussnessException e) {
        e.printStackTrace(); // 自己打出来看
        //// 通过枚举获取对应的错误码和消息
        //GlobleExceptioniContants globleExceptioniContants = e.getGlobleExceptioniContants();
        //return JSONResult.error(globleExceptioniContants.getMessasge(), globleExceptioniContants.getCode());
        e.printStackTrace();

        // 检查是否有自定义消息
        if (e.getCustomMessage() != null) {
            // 使用自定义消息，错误码可以使用通用业务错误码
            return JSONResult.error(
                    e.getCustomMessage()
            );
        } else {
            // 使用异常常量中的错误码和消息
            GlobleExceptioniContants exceptionConstants = e.getGlobleExceptioniContants();
            return JSONResult.error(
                    exceptionConstants.getCode(),
                    exceptionConstants.getMessasge()
            );
        }
    }

    @ExceptionHandler(RuntimeException.class)
    public JSONResult handleValidationException(RuntimeException e) {
        String message = e.getMessage();
        // 获取验证失败的字段错误信息
        return JSONResult.error(message);
    }

}